<?php
namespace UserProposal;

use Pinenut\Form;
use Pinenut\Config;
/**
 * Форма приёма предложения пользователя
 *
 * @author kosh
 *        
 */
abstract class ProposalAction extends \Action {
	protected static $isPublic = true;
	
	protected static $layout = "";

	/**
	 * @var string
	 */
	protected $type;
	
	/**
	 * @var Config
	 */
	protected static $_formConfigClass;
	
	static function pullParams() {
		return ['identity', 'isPost'];
	}
	
	function getUserId() {
		return $this->request->_identity;
	}
	
	protected function run() {
		
		$userId = $this->getUserId();
		
		if (strlen($this->request->proposalId)) {
			$proposal = Proposal::find($this->request->proposalId);
		} 
		
		if (!$proposal) {
			// получаем состояние текущего или получаем новый, в общем что-нить да получаем
			$proposal = Proposal::get(
				$userId, 
				$this->type, 
				$this->request->id,
				true
			);
		}
		
		$proposal = $this->onBeforeForm($proposal);
		$this->response->proposal = $proposal;
		// делаем форму по конфе
		
		$formConfigClass = static::$_formConfigClass;
		$formConfig = $formConfigClass::get();
		$formConfig['htmlOptions']['action'] = $this->url($this->request->action, ['id'=>$this->request->id, 'proposalId' => (string)$proposal] );
		$form = new Form($userId, 'UserProposal-'.$this->type. $this->request->id, $formConfig);
		
		if ($this->request->_isPost && $this->request->isPartial) {
			// обработчик валидации и черновика
			$form->process($this->request->params(), true);
			$this->response->content =  $form->render();
			$this->response->noRender(true);
			return;
			
		} elseif ($this->request->_isPost ) {
			// проверяем полне данные
			if (!$form->process($this->request->params())) {
				$this->response->form = $form;
				
				return;
			}
			// уже проверили что всё ок
			$data = $form->getValues ();
				
			// делаем что-то полезное
						
			// устанавливаем статус предложений, предполагаем что тут может 
			// быть либо уже предложенное либо новое
			
			$proposal->state = Proposal::STATE_PROPOSED;
			// добавляем пользлвателя если его не было
			if (!in_array($userId, $proposal->userIds)) {
				$proposal->userIds[] = $userId;
			}
			
			// например модифицируем заявку
			$proposal = $this->doProposal($proposal, $data);
				
			$proposal->save();
			
			$this->proposalAfterSave($proposal);
			
			$form->flush();
			$this->response->noRender(true);
		} else {
			//$form->setValues();
		}
		
		$this->response->form = $form;
	}
	
	public function proposalAfterSave($proposal)
	{

	}
	
	/**
	 * Еще как-то модифицируем предложение в соответствии с нашей логикой для этого типа предложения
	 * @param Proposal $proposal
	 * @param array $data
	 * @return unknown
	 */
	function doProposal($proposal, $data) {
		return $proposal;
	}
	
	public function onBeforeForm($proposal)
	{
		return $proposal;
	}
}